package com.example.myproject.kotlin

// 1. 使用 object 关键字创建单例（最简单的方式）
object SimpleLogger {
    fun log(message: String) {
        println("[LOG] $message")
    }
    
    fun error(message: String) {
        println("[ERROR] $message")
    }
}

// 2. 带属性的单例
object AppConfig {
    val apiUrl: String = "https://api.example.com"
    val version: String = "1.0.0"
    var debugMode: Boolean = true
    
    fun getConfigInfo(): String {
        return "API: $apiUrl, Version: $version, Debug: $debugMode"
    }
}

// 3. 伴生对象单例（Companion Object）
class DatabaseManager private constructor() {
    fun connect() {
        println("连接数据库")
    }
    
    fun query(sql: String) {
        println("执行查询: $sql")
    }
    
    companion object {
        val instance: DatabaseManager by lazy { DatabaseManager() }
    }
}

// 4. 懒加载单例
object DataManager {
    init {
        println("数据管理器初始化")
    }
    
    private val data = mutableListOf<String>()
    
    fun addData(item: String) {
        data.add(item)
    }
    
    fun getData(): List<String> {
        return data.toList()
    }
}

// 使用示例
fun main() {
    println("=== 基本单例使用 ===")
    SimpleLogger.log("应用程序启动")
    SimpleLogger.error("发生错误")
    
    println("\n=== 带属性的单例 ===")
    println(AppConfig.getConfigInfo())
    AppConfig.debugMode = false
    println("调试模式: ${AppConfig.debugMode}")
    
    println("\n=== 伴生对象单例 ===")
    val db = DatabaseManager.instance
    db.connect()
    db.query("SELECT * FROM users")
    
    // 验证单例唯一性
    val db2 = DatabaseManager.instance
    println("db === db2: ${db === db2}")  // true 表示是同一个实例
    
    println("\n=== 懒加载单例 ===")
    DataManager.addData("数据项1")
    DataManager.addData("数据项2")
    println("数据列表: ${DataManager.getData()}")
}